﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Common;
using System.Configuration;

namespace Pencas.Models
{
    public class DAOPronostico
    {
        private string connectionString = ConfigurationManager.ConnectionStrings["mydb"].ToString();//"Data Source=GABRIEL-PC;Initial Catalog=Pencas;Integrated Security=True; MultipleActiveResultSets=True;";

        /// <summary>
        /// Guarda los resultados en la base de datos
        /// </summary>
        /// <param name="resultados">Resultados en el formato partido1;golesA;golesB;partido2;golesA;golesB;...partidoN;golesA;golesB</param>
        public void GuardarPronostico(string resultados, Usuario u)
        {
            SQLServerConnection connection = SQLServerConnection.GetInstance(connectionString);

            string[] vecResultados = resultados.Split(';');
            for (int i = 0; i < vecResultados.Length; i++)
            {
                if (i % 2 == 0)
                {
                    string[] vecGoles = vecResultados[i + 1].Split('-');
                    int golesA = Int32.Parse(vecGoles[0]);
                    int golesB = Int32.Parse(vecGoles[1]);
                    connection.ExecuteNonQuery(String.Format("INSERT INTO PronosticoPartido(idPartido,idUsuario,golesA,golesB) VALUES({0},{1},{2},{3})", vecResultados[i], u.Id, golesA, golesB));
                }
            }
        }

        public void GuardarPronosticosEspeciales(string resultadosEspeciales, Usuario u)
        {
            SQLServerConnection connection = SQLServerConnection.GetInstance(connectionString);
            
            string[] vecResultados = resultadosEspeciales.Split(';');
            connection.ExecuteNonQuery(String.Format("INSERT INTO PronosticosEspeciales(idPrimeroA, idSegundoB, idPrimeroB, idSegundoA, idPerdedorCruce1, idPerdedorCruce2, idGanadorCruce1, idGanadorCruce2, idPrimero,idSegundo,idTercero,idMasGoles,idCantGoles, idUsuario) VALUES({0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13})"
                , vecResultados[0], vecResultados[1], vecResultados[2], vecResultados[3]
                , vecResultados[4], vecResultados[5], vecResultados[6], vecResultados[7]
                , vecResultados[8], vecResultados[9], vecResultados[10], vecResultados[11]
                , vecResultados[12], u.Id));
        }

        public string RecuperarPronostico(Usuario u)
        {
            DAOEquipo equipoDAO = new DAOEquipo();
            SQLServerConnection connection = SQLServerConnection.GetInstance(connectionString);
            string consulta = String.Format("SELECT * FROM PronosticoPartido WHERE idUsuario = {0}", u.Id);
            string pronosticos = "";
            DbDataReader reader = connection.Execute(consulta);
            while (reader.Read())
            {
                pronosticos += reader.GetInt32(2) + ";";
                pronosticos += reader.GetInt32(3) + ";";
            }
            reader.Close();
            consulta = String.Format("SELECT * FROM PronosticosEspeciales WHERE idUsuario = {0}", u.Id);
            reader = connection.Execute(consulta);
            reader.Read();
            for (int i = 1; i < 13; i++)
            {
                pronosticos += equipoDAO.GetNombreEquipoPorId(reader.GetInt32(i)) + ";";
            }
            pronosticos += reader.GetInt32(13);
            return pronosticos;
        }

        /// <summary>
        /// Retorna una lista de arrays de int con el id del usuario en el índice 0,
        /// el nombre en el índice 1, y su puntaje en el índice 2. La lista está ordenada
        /// por puntaje
        /// </summary>
        /// <returns></returns>
        public List<string[]> GetPositions()
        {
            SQLServerConnection connection = SQLServerConnection.GetInstance(connectionString);
            List<string[]> retorno = new List<string[]>();
            DbDataReader reader = connection.Execute("SELECT TOP 20 * FROM Usuario ORDER BY PUNTAJE DESC, ID ASC");
            while (reader.Read())
            {
                retorno.Add(new string[] {reader.GetInt32(0) + "", reader.GetString(1).Split('@')[0], reader.GetInt32(3) + ""});
            }
            reader.Close();
            return retorno;
        }

        /// <summary>
        /// Retorna una lista con arrays de strings de 4 posiciones que representan
        /// cada una un pronóstico del usuario. Pos 0: id, Pos 1: token, Pos 2: puntaje
        /// Pos 3: posición
        /// </summary>
        /// <param name="token">Token usado por el usuario para registrar sus resultados</param>
        /// <returns></returns>
        public List<string[]> GetUserScoreAndPosition(string email)
        {
            DAOUsuario usuarioDAO = new DAOUsuario();
            List<Usuario> usuarios = new List<Usuario>();
            try
            {
                usuarios = usuarioDAO.GetUsuariosPorEmail(email);
            }
            catch (NoExisteUsuarioException e)
            {
                throw e;
            }
            SQLServerConnection connection = SQLServerConnection.GetInstance(connectionString);
            List<string[]> retorno = new List<string[]>();
            foreach(Usuario u in usuarios){
                string[] pronostico = new string[4];
                pronostico[0] = u.Id + "";
                pronostico[1] = u.Token;
                pronostico[2] = u.Puntaje + "";
                string consulta = String.Format("SELECT COUNT(*) + 1 FROM Usuario "
                    +"WHERE puntaje > {0} OR (puntaje = {0} AND id < {1})", u.Puntaje, u.Id);
                DbDataReader reader = connection.Execute(consulta);
                reader.Read();
                pronostico[3] = reader.GetInt32(0) + "";
                retorno.Add(pronostico);
                reader.Close();
            }
            return retorno;
        }

        //public List<string[]> GetIdTokenDeusuario(string email)
        //{
        //    SQLServerConnection connection = SQLServerConnection.GetInstance(connectionString);
        //    List<string[]> retorno = new List<string[]>();
        //    string consulta = String.Format("SELECT Id, Token FROM Usuario WHERE email = '{0}'", email);
        //    DbDataReader reader = connection.Execute(consulta);
        //    while (reader.Read())
        //    {
        //        retorno.Add(new string[] { reader.GetInt32(0) + "", reader.GetString(1) });
        //    }
        //    return retorno;
        //}

        //public int ResultadoPronostico(Usuario u)
        //{
        //    SQLServerConnection connection = SQLServerConnection.GetInstance(connectionString);
        //    string consulta = String.Format("SELECT * FROM PronosticoPartido WHERE id = {0}", u.Id);
        //    DbDataReader reader = connection.Execute(consulta);
        //    List<int> pronosticados = new List<int>();
        //    List<int> reales = new List<int>();
        //    int puntaje = 0;
        //    while (reader.Read())
        //    {
        //        pronosticados.Add(reader.GetInt32(2));
        //        pronosticados.Add(reader.GetInt32(3));
        //    }
        //    consulta = String.Format("SELECT * FROM Partido");
        //    reader = connection.Execute(consulta);
        //    while (reader.Read())
        //    {
        //        reales.Add(reader.GetInt32(2));
        //        reales.Add(reader.GetInt32(3));
        //    }
        //    for (int i = 0; i < 32; i = i + 2)
        //    {
        //        puntaje += PuntosPartido(pronosticados[i], pronosticados[i+1], reales[i], reales[i+1]);
        //    }
        //    return puntaje;
        //}

        //public int PuntosPartido(int pronosticoA, int pronosticoB, int realA, int realB)
        //{
        //    //Si todavía no se jugó el partido, no se suman puntos
        //    if (realA != -1)
        //    {
        //        return 0;
        //    }
        //    return 0;
        //}
    }
}